6  bulkTCRseq: Pie chart showing percent of IMP-expanded clones

6.1 Set up workspace

# Libraries
library(dplyr)

Attaching package: 'dplyr'
The following objects are masked from 'package:stats':

    filter, lag
The following objects are masked from 'package:base':

    intersect, setdiff, setequal, union
library(tidyverse)
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ forcats   1.0.0     ✔ readr     2.1.5
✔ ggplot2   3.5.1     ✔ stringr   1.5.1
✔ lubridate 1.9.4     ✔ tibble    3.2.1
✔ purrr     1.0.4     ✔ tidyr     1.3.1
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(reshape2)

Attaching package: 'reshape2'

The following object is masked from 'package:tidyr':

    smiths
library(ggplot2)
library(patchwork)
library(webr)
library(moonBook)
library(ggforce)
library(grid)
library(ggprism)

6.2 Load colors

pt_cols <- readRDS("Part0_Patient_Color.rds")

6.3 Load all clones

p101_betas_typed <- read.csv("p101_betas_merged_typed_Part3.csv")
p103_betas_typed <- read.csv("p103_betas_merged_typed_Part3.csv")
p104_betas_typed <- read.csv("p104_betas_merged_typed_Part3.csv")
p105_betas_typed <- read.csv("p105_betas_merged_typed_Part3.csv")
p106_betas_typed <- read.csv("p106_betas_merged_typed_Part3.csv")
p108_betas_typed <- read.csv("p108_betas_merged_typed_Part3.csv")
p109_betas_typed <- read.csv("p109_betas_merged_typed_Part3.csv")
p110_betas_typed <- read.csv("p110_betas_merged_typed_Part3.csv")
p111_betas_typed <- read.csv("p111_betas_merged_typed_Part3.csv")

6.4 Update PieDonut code to allow changing colors

Code lifted from: https://stackoverflow.com/questions/68095243/piedonut-how-to-change-color-of-pie-and-donut

PieDonutCustom <- function(pie_cols, donut_cols, data, mapping, start = getOption("PieDonut.start", 
  0), addPieLabel = TRUE, addDonutLabel = TRUE, showRatioDonut = TRUE, 
  showRatioPie = TRUE, ratioByGroup = TRUE, showRatioThreshold = getOption("PieDonut.showRatioThreshold", 
    0.02), labelposition = getOption("PieDonut.labelposition", 
    2), labelpositionThreshold = 0.1, r0 = getOption("PieDonut.r0", 
    0.3), r1 = getOption("PieDonut.r1", 1), r2 = getOption("PieDonut.r2", 
    1.2), explode = NULL, selected = NULL, explodePos = 0.1, 
  color = "white", pieAlpha = 0.8, donutAlpha = 1, maxx = NULL, 
  showPieName = TRUE, showDonutName = FALSE, title = NULL, 
  pieLabelSize = 4, donutLabelSize = 3, titlesize = 5, explodePie = TRUE, 
  explodeDonut = FALSE, use.label = FALSE, use.labels = FALSE, 
  family = getOption("PieDonut.family", "")) 
{
  (cols = colnames(data))
  if (use.labels) 
    data = moonBook::addLabelDf(data, mapping)
  count <- NULL
  if ("count" %in% names(mapping)) 
    count <- moonBook::getMapping(mapping, "count")
  count
  pies <- donuts <- NULL
  (pies = moonBook::getMapping(mapping, "pies"))
  if (is.null(pies)) 
    (pies = moonBook::getMapping(mapping, "pie"))
  if (is.null(pies)) 
    (pies = moonBook::getMapping(mapping, "x"))
  (donuts = moonBook::getMapping(mapping, "donuts"))
  if (is.null(donuts)) 
    (donuts = moonBook::getMapping(mapping, "donut"))
  if (is.null(donuts)) 
    (donuts = moonBook::getMapping(mapping, "y"))
  if (!is.null(count)) {
    df <- data %>% group_by(.data[[pies]]) %>% dplyr::summarize(Freq = sum(.data[[count]]))
    df
  }
  else {
    df = data.frame(table(data[[pies]]))
  }
  colnames(df)[1] = pies
  df$end = cumsum(df$Freq)
  df$start = dplyr::lag(df$end)
  df$start[1] = 0
  total = sum(df$Freq)
  df$start1 = df$start * 2 * pi/total
  df$end1 = df$end * 2 * pi/total
  df$start1 = df$start1 + start
  df$end1 = df$end1 + start
  df$focus = 0
  if (explodePie) 
    df$focus[explode] = explodePos
  df$mid = (df$start1 + df$end1)/2
  df$x = ifelse(df$focus == 0, 0, df$focus * sin(df$mid))
  df$y = ifelse(df$focus == 0, 0, df$focus * cos(df$mid))
  df$label = df[[pies]]
  df$ratio = df$Freq/sum(df$Freq)
  if (showRatioPie) {
    df$label = ifelse(df$ratio >= showRatioThreshold, paste0(df$label, 
      "\n(", scales::percent(df$ratio), ")"), as.character(df$label))
  }
  df$labelx = (r0 + r1)/2 * sin(df$mid) + df$x
  df$labely = (r0 + r1)/2 * cos(df$mid) + df$y
  if (!is.factor(df[[pies]])) 
    df[[pies]] <- factor(df[[pies]])
  df
  mainCol = pie_cols
  # mainCol = gg_color_hue(nrow(df))
  df$radius = r1
  df$radius[df$focus != 0] = df$radius[df$focus != 0] + df$focus[df$focus != 
    0]
  df$hjust = ifelse((df$mid%%(2 * pi)) > pi, 1, 0)
  df$vjust = ifelse(((df$mid%%(2 * pi)) < (pi/2)) | (df$mid%%(2 * 
    pi) > (pi * 3/2)), 0, 1)
  df$segx = df$radius * sin(df$mid)
  df$segy = df$radius * cos(df$mid)
  df$segxend = (df$radius + 0.05) * sin(df$mid)
  df$segyend = (df$radius + 0.05) * cos(df$mid)
  df
  if (!is.null(donuts)) {
    # subColor = makeSubColor(mainCol, no = length(unique(data[[donuts]])))
    subColor = donut_cols
    subColor
    data
    if (!is.null(count)) {
      df3 <- as.data.frame(data[c(donuts, pies, count)])
      colnames(df3) = c("donut", "pie", "Freq")
      df3
      df3 <- eval(parse(text = "complete(df3,donut,pie)"))
      df3$Freq[is.na(df3$Freq)] = 0
      if (!is.factor(df3[[1]])) 
        df3[[1]] = factor(df3[[1]])
      if (!is.factor(df3[[2]])) 
        df3[[2]] = factor(df3[[2]])
      df3 <- df3 %>% arrange(.data$pie, .data$donut)
      a <- df3 %>% tidyr::spread(.data$pie, value = .data$Freq)
      a = as.data.frame(a)
      a
      rownames(a) = a[[1]]
      a = a[-1]
      a
      colnames(df3)[1:2] = c(donuts, pies)
    }
    else {
      df3 = data.frame(table(data[[donuts]], data[[pies]]), 
        stringsAsFactors = FALSE)
      colnames(df3)[1:2] = c(donuts, pies)
      a = table(data[[donuts]], data[[pies]])
      a
    }
    a
    df3
    df3$group = rep(colSums(a), each = nrow(a))
    df3$pie = rep(1:ncol(a), each = nrow(a))
    total = sum(df3$Freq)
    total
    df3$ratio1 = df3$Freq/total
    df3
    if (ratioByGroup) {
      df3$ratio = scales::percent(df3$Freq/df3$group)
    }
    else {
      df3$ratio <- scales::percent(df3$ratio1)
    }
    df3$end = cumsum(df3$Freq)
    df3
    df3$start = dplyr::lag(df3$end)
    df3$start[1] = 0
    df3$start1 = df3$start * 2 * pi/total
    df3$end1 = df3$end * 2 * pi/total
    df3$start1 = df3$start1 + start
    df3$end1 = df3$end1 + start
    df3$mid = (df3$start1 + df3$end1)/2
    df3$focus = 0
    if (!is.null(selected)) {
      df3$focus[selected] = explodePos
    }
    else if (!is.null(explode)) {
      selected = c()
      for (i in 1:length(explode)) {
        start = 1 + nrow(a) * (explode[i] - 1)
        selected = c(selected, start:(start + nrow(a) - 
          1))
      }
      selected
      df3$focus[selected] = explodePos
    }
    df3
    df3$x = 0
    df3$y = 0
    df
    if (!is.null(explode)) {
      explode
      for (i in 1:length(explode)) {
        xpos = df$focus[explode[i]] * sin(df$mid[explode[i]])
        ypos = df$focus[explode[i]] * cos(df$mid[explode[i]])
        df3$x[df3$pie == explode[i]] = xpos
        df3$y[df3$pie == explode[i]] = ypos
      }
    }
    df3$no = 1:nrow(df3)
    df3$label = df3[[donuts]]
    if (showRatioDonut) {
      if (max(nchar(levels(df3$label))) <= 2) 
        df3$label = paste0(df3$label, "(", df3$ratio, 
          ")")
      else df3$label = paste0(df3$label, "\n(", df3$ratio, 
        ")")
    }
    df3$label[df3$ratio1 == 0] = ""
    df3$label[df3$ratio1 < showRatioThreshold] = ""
    df3$hjust = ifelse((df3$mid%%(2 * pi)) > pi, 1, 0)
    df3$vjust = ifelse(((df3$mid%%(2 * pi)) < (pi/2)) | 
      (df3$mid%%(2 * pi) > (pi * 3/2)), 0, 1)
    df3$no = factor(df3$no)
    df3
    labelposition
    if (labelposition > 0) {
      df3$radius = r2
      if (explodeDonut) 
        df3$radius[df3$focus != 0] = df3$radius[df3$focus != 
          0] + df3$focus[df3$focus != 0]
      df3$segx = df3$radius * sin(df3$mid) + df3$x
      df3$segy = df3$radius * cos(df3$mid) + df3$y
      df3$segxend = (df3$radius + 0.05) * sin(df3$mid) + 
        df3$x
      df3$segyend = (df3$radius + 0.05) * cos(df3$mid) + 
        df3$y
      if (labelposition == 2) 
        df3$radius = (r1 + r2)/2
      df3$labelx = (df3$radius) * sin(df3$mid) + df3$x
      df3$labely = (df3$radius) * cos(df3$mid) + df3$y
    }
    else {
      df3$radius = (r1 + r2)/2
      if (explodeDonut) 
        df3$radius[df3$focus != 0] = df3$radius[df3$focus != 
          0] + df3$focus[df3$focus != 0]
      df3$labelx = df3$radius * sin(df3$mid) + df3$x
      df3$labely = df3$radius * cos(df3$mid) + df3$y
    }
    df3$segx[df3$ratio1 == 0] = 0
    df3$segxend[df3$ratio1 == 0] = 0
    df3$segy[df3$ratio1 == 0] = 0
    df3$segyend[df3$ratio1 == 0] = 0
    if (labelposition == 0) {
      df3$segx[df3$ratio1 < showRatioThreshold] = 0
      df3$segxend[df3$ratio1 < showRatioThreshold] = 0
      df3$segy[df3$ratio1 < showRatioThreshold] = 0
      df3$segyend[df3$ratio1 < showRatioThreshold] = 0
    }
    df3
    del = which(df3$Freq == 0)
    del
    if (length(del) > 0) 
      subColor <- subColor[-del]
    subColor
  }
  p <- ggplot() + ggforce::theme_no_axes() + coord_fixed()
  if (is.null(maxx)) {
    r3 = r2 + 0.3
  }
  else {
    r3 = maxx
  }
  p1 <- p + ggforce::geom_arc_bar(aes_string(x0 = "x", y0 = "y", r0 = as.character(r0), 
    r = as.character(r1), start = "start1", end = "end1", 
    fill = pies), alpha = pieAlpha, color = color, data = df) + 
    transparent() + scale_fill_manual(values = mainCol) + 
    xlim(r3 * c(-1, 1)) + ylim(r3 * c(-1, 1)) + guides(fill = FALSE)
  if ((labelposition == 1) & (is.null(donuts))) {
    p1 <- p1 
    # + geom_segment(aes_string(x = "segx", y = "segy", 
    #   xend = "segxend", yend = "segyend"), data = df) + 
    #   geom_text(aes_string(x = "segxend", y = "segyend", 
    #     label = "label", hjust = "hjust", vjust = "vjust"), 
    #     size = pieLabelSize, data = df, family = family)
  }
  else if ((labelposition == 2) & (is.null(donuts))) {
    p1 <- p1 
    # + geom_segment(aes_string(x = "segx", y = "segy", 
    #   xend = "segxend", yend = "segyend"), data = df[df$ratio < 
    #   labelpositionThreshold, ]) + geom_text(aes_string(x = "segxend", 
    #   y = "segyend", label = "label", hjust = "hjust", 
    #   vjust = "vjust"), size = pieLabelSize, data = df[df$ratio < 
    #   labelpositionThreshold, ], family = family) + geom_text(aes_string(x = "labelx", 
    #   y = "labely", label = "label"), size = pieLabelSize, 
    #   data = df[df$ratio >= labelpositionThreshold, ], 
    #   family = family)
  }
  else {
    p1 <- p1 
    # + geom_text(aes_string(x = "labelx", y = "labely",
    #   label = "label"), size = pieLabelSize, data = df,
    #   family = family) + theme(plot.margin = margin(1,2,1,1, "cm"))
  }
  if (showPieName) 
    p1 <- p1 + annotate("text", x = 0, y = 0, label = pies, 
      size = titlesize, family = family)
  # p1 <- p1 + theme(text = element_text(family = family))
    p1 <- p1 + theme(text = element_blank())

  if (!is.null(donuts)) {
    if (explodeDonut) {
      p3 <- p + ggforce::geom_arc_bar(aes_string(x0 = "x", y0 = "y", 
        r0 = as.character(r1), r = as.character(r2), 
        start = "start1", end = "end1", fill = "no", 
        explode = "focus"), alpha = donutAlpha, color = color, 
        data = df3)
    }
    else {
      p3 <- p + ggforce::geom_arc_bar(aes_string(x0 = "x", y0 = "y", 
        r0 = as.character(r1), r = as.character(r2), 
        start = "start1", end = "end1", fill = "no"), 
        alpha = donutAlpha, color = color, data = df3)
    }
    p3 <- p3 + transparent() + scale_fill_manual(values = subColor) + 
      xlim(r3 * c(-1, 1)) + ylim(r3 * c(-1, 1)) + guides(fill = FALSE)
    p3
    if (labelposition == 1) {
      p3 <- p3 
      # + geom_segment(aes_string(x = "segx", y = "segy", 
      #   xend = "segxend", yend = "segyend"), data = df3) + 
      #   geom_text(aes_string(x = "segxend", y = "segyend", 
      #     label = "label", hjust = "hjust", vjust = "vjust"), 
      #     size = donutLabelSize, data = df3, family = family)
    }
    else if (labelposition == 0) {
      p3 <- p3 
      # + geom_text(aes_string(x = "labelx", y = "labely", 
      #   label = "label"), size = donutLabelSize, data = df3, 
      #   family = family)
    }
    else {
      p3 <- p3 
      # + geom_segment(aes_string(x = "segx", y = "segy", 
      #   xend = "segxend", yend = "segyend"), data = df3[df3$ratio1 < 
      #   labelpositionThreshold, ]) + geom_text(aes_string(x = "segxend", 
      #   y = "segyend", label = "label", hjust = "hjust", 
      #   vjust = "vjust"), size = donutLabelSize, data = df3[df3$ratio1 < 
      #   labelpositionThreshold, ], family = family) + 
      #   geom_text(aes_string(x = "labelx", y = "labely", 
      #     label = "label"), size = donutLabelSize, data = df3[df3$ratio1 >= 
      #     labelpositionThreshold, ], family = family)
    }
    if (!is.null(title)) 
      p3 <- p3 + annotate("text", x = 0, y = r3, label = title, 
        size = titlesize, family = family)
    else if (showDonutName) 
      p3 <- p3 
    # + annotate("text", x = (-1) * r3, y = r3, 
    #     label = donuts, hjust = 0, size = titlesize, 
    #     family = family)
    # p3 <- p3 + theme(text = element_text(family = family), plot.margin = margin(1,2,1,1, "cm")) 
     p1 <- p1 + theme(text = element_blank(), axis.text.x = element_blank(), axis.text.y = element_blank(), plot.margin = margin(1,2,1,1, "cm"))
    p3 <- p3 + theme(text = element_blank(), axis.text.x = element_blank(), axis.text.y = element_blank(), plot.margin = margin(1,2,1,1, "cm")) 
    grid.newpage()
    print(p1, vp = viewport(height = 1, width = 1))
    print(p3, vp = viewport(height = 1, width = 1))
  }
  else {
    p1
  }
}

6.5 Save specific PieDonut customization

PieDonutSetting <- function(dat, plot_title){
  PieDonutCustom(data = dat, aes(Type, specific, count=n),
             ratioByGroup = T,showRatioThreshold=0,
             explode=0,
             pie_cols = c("grey70", "darkgoldenrod3", "#0072B2"),
             donut_cols = c("grey30", "#920000FF" ,"grey30" ,"#920000FF", "grey30", "#920000FF"),
             selected = 6,
             explodeDonut=TRUE,
             r0=0,
             r1=0.5,
             r2=0.7,
             showPieName = FALSE,
             showRatioDonut = FALSE,
             showDonutName = FALSE,
             use.label = FALSE,
             pieAlpha = 1,
             pieLabelSize = 0,
             donutLabelSize = 0, title = plot_title)
}

6.6 Plot the expanded Existing, Post-Nivolumab and Post-vaccine clones as a piechart

full <- do.call(rbind, list(p101_betas_typed[c("Beta_clonotype", "expanded_local_min", "Type", "Patient")], 
                                         p103_betas_typed[c("Beta_clonotype", "expanded_local_min", "Type", "Patient")],
                                         p104_betas_typed[c("Beta_clonotype", "expanded_local_min", "Type", "Patient")],
                                         p105_betas_typed[c("Beta_clonotype", "expanded_local_min", "Type", "Patient")],
                                         p106_betas_typed[c("Beta_clonotype", "expanded_local_min", "Type", "Patient")],
                                         p108_betas_typed[c("Beta_clonotype", "expanded_local_min", "Type", "Patient")],
                                         p109_betas_typed[c("Beta_clonotype", "expanded_local_min", "Type", "Patient")],
                                         p110_betas_typed[c("Beta_clonotype", "expanded_local_min", "Type", "Patient")],
                                         p111_betas_typed[c("Beta_clonotype", "expanded_local_min", "Type", "Patient")]))

6.7 Plot piechart per patient for Fig S5B

full %>%
  mutate(specific = case_when(expanded_local_min == TRUE ~ "Specific",
                              expanded_local_min == FALSE ~ "Not specific")
         # specific = factor(specific, levels = c("Unspecific", "Specific"))
         ) %>%
  group_by(Type,specific) %>%
  filter(Patient == "P101",
         !is.na(specific)) %>%
  dplyr::count() %>%
  PieDonutSetting(plot_title = "P101")
Warning in `[<-.factor`(`*tmp*`, df3$ratio1 == 0, value = ""): invalid factor
level, NA generated
Warning in `[<-.factor`(`*tmp*`, df3$ratio1 < showRatioThreshold, value = ""):
invalid factor level, NA generated
Warning: `aes_string()` was deprecated in ggplot2 3.0.0.
ℹ Please use tidy evaluation idioms with `aes()`.
ℹ See also `vignette("ggplot2-in-packages")` for more information.
Warning: The `<scale>` argument of `guides()` cannot be `FALSE`. Use "none" instead as
of ggplot2 3.3.4.
Warning in ggforce::geom_arc_bar(aes_string(x0 = "x", y0 = "y", r0 =
as.character(r1), : Ignoring unknown aesthetics: explode

full %>%
  mutate(specific = case_when(expanded_local_min == TRUE ~ "Specific",
                              expanded_local_min == FALSE ~ "Not specific")
         # specific = factor(specific, levels = c("Unspecific", "Specific"))
         ) %>%
  group_by(Type,specific) %>%
  filter(Patient == "P103",
         !is.na(specific)) %>%
  dplyr::count() %>%
  PieDonutSetting(plot_title = "P103") 
Warning in `[<-.factor`(`*tmp*`, df3$ratio1 == 0, value = ""): invalid factor
level, NA generated
Warning in `[<-.factor`(`*tmp*`, df3$ratio1 < showRatioThreshold, value = ""):
invalid factor level, NA generated
Warning in ggforce::geom_arc_bar(aes_string(x0 = "x", y0 = "y", r0 =
as.character(r1), : Ignoring unknown aesthetics: explode

full %>%
  mutate(specific = case_when(expanded_local_min == TRUE ~ "Specific",
                              expanded_local_min == FALSE ~ "Not specific")
         # specific = factor(specific, levels = c("Unspecific", "Specific"))
         ) %>%
  group_by(Type,specific) %>%
  filter(Patient == "P104",
         !is.na(specific)) %>%
  dplyr::count() %>%
  PieDonutCustom(aes(Type, specific, count=n),
             ratioByGroup = T,showRatioThreshold=0,
             explode=0,
             pie_cols = c("grey70", "darkgoldenrod3", "#0072B2"),
             # donut_cols = c("#CDDAEC", "#920000FF" ,"#FED6C1" ,"#920000FF", "#ECECEC", "#920000FF"),
             donut_cols = c("grey30", "#920000FF" ,"grey30" ,"#920000FF", "grey30", "#920000FF"),
             selected = 5,
             explodeDonut=TRUE,
             r0=0,
             r1=0.5,
             r2=0.7,
             showPieName = FALSE,
             showRatioDonut = FALSE,
             showDonutName = FALSE,
             use.label = FALSE,
             pieAlpha = 1,
             pieLabelSize = 0,
             donutLabelSize = 5,
             title = "P104")
Warning in `[<-.factor`(`*tmp*`, df3$ratio1 == 0, value = ""): invalid factor
level, NA generated
Warning in `[<-.factor`(`*tmp*`, df3$ratio1 < showRatioThreshold, value = ""):
invalid factor level, NA generated
Warning in ggforce::geom_arc_bar(aes_string(x0 = "x", y0 = "y", r0 =
as.character(r1), : Ignoring unknown aesthetics: explode

full %>%
  mutate(specific = case_when(expanded_local_min == TRUE ~ "Specific",
                              expanded_local_min == FALSE ~ "Not specific")
         # specific = factor(specific, levels = c("Unspecific", "Specific"))
         ) %>%
  group_by(Type,specific) %>%
  filter(Patient == "P105",
         !is.na(specific)) %>%
  dplyr::count() %>%
  PieDonutSetting(plot_title = "P105")
Warning in `[<-.factor`(`*tmp*`, df3$ratio1 == 0, value = ""): invalid factor
level, NA generated
Warning in `[<-.factor`(`*tmp*`, df3$ratio1 < showRatioThreshold, value = ""):
invalid factor level, NA generated
Warning in ggforce::geom_arc_bar(aes_string(x0 = "x", y0 = "y", r0 =
as.character(r1), : Ignoring unknown aesthetics: explode

full %>%
  mutate(specific = case_when(expanded_local_min == TRUE ~ "Specific",
                              expanded_local_min == FALSE ~ "Not specific")
         # specific = factor(specific, levels = c("Unspecific", "Specific"))
         ) %>%
  group_by(Type,specific) %>%
  filter(Patient == "P106",
         !is.na(specific)) %>%
  dplyr::count() %>%
  PieDonutSetting(plot_title = "P106")
Warning in `[<-.factor`(`*tmp*`, df3$ratio1 == 0, value = ""): invalid factor
level, NA generated
Warning in `[<-.factor`(`*tmp*`, df3$ratio1 < showRatioThreshold, value = ""):
invalid factor level, NA generated
Warning in ggforce::geom_arc_bar(aes_string(x0 = "x", y0 = "y", r0 =
as.character(r1), : Ignoring unknown aesthetics: explode

full %>%
  mutate(specific = case_when(expanded_local_min == TRUE ~ "Specific",
                              expanded_local_min == FALSE ~ "Not specific")
         # specific = factor(specific, levels = c("Unspecific", "Specific"))
         ) %>%
  group_by(Type,specific) %>%
  filter(Patient == "P108",
         !is.na(specific)) %>%
  dplyr::count() %>%
  PieDonutSetting(plot_title = "P108")
Warning in `[<-.factor`(`*tmp*`, df3$ratio1 == 0, value = ""): invalid factor
level, NA generated
Warning in `[<-.factor`(`*tmp*`, df3$ratio1 < showRatioThreshold, value = ""):
invalid factor level, NA generated
Warning in ggforce::geom_arc_bar(aes_string(x0 = "x", y0 = "y", r0 =
as.character(r1), : Ignoring unknown aesthetics: explode

full %>%
  mutate(specific = case_when(expanded_local_min == TRUE ~ "Specific",
                              expanded_local_min == FALSE ~ "Not specific")
         # specific = factor(specific, levels = c("Unspecific", "Specific"))
         ) %>%
  group_by(Type,specific) %>%
  filter(Patient == "P109",
         !is.na(specific)) %>%
  dplyr::count() %>%
  PieDonutSetting(plot_title = "P109")
Warning in `[<-.factor`(`*tmp*`, df3$ratio1 == 0, value = ""): invalid factor
level, NA generated
Warning in `[<-.factor`(`*tmp*`, df3$ratio1 < showRatioThreshold, value = ""):
invalid factor level, NA generated
Warning in ggforce::geom_arc_bar(aes_string(x0 = "x", y0 = "y", r0 =
as.character(r1), : Ignoring unknown aesthetics: explode

full %>%
  mutate(specific = case_when(expanded_local_min == TRUE ~ "Specific",
                              expanded_local_min == FALSE ~ "Not specific")
         # specific = factor(specific, levels = c("Unspecific", "Specific"))
         ) %>%
  group_by(Type,specific) %>%
  filter(Patient == "P110",
         !is.na(specific)) %>%
  dplyr::count() %>%
  PieDonutSetting(plot_title = "P110")
Warning in `[<-.factor`(`*tmp*`, df3$ratio1 == 0, value = ""): invalid factor
level, NA generated
Warning in `[<-.factor`(`*tmp*`, df3$ratio1 < showRatioThreshold, value = ""):
invalid factor level, NA generated
Warning in ggforce::geom_arc_bar(aes_string(x0 = "x", y0 = "y", r0 =
as.character(r1), : Ignoring unknown aesthetics: explode

full %>%
  mutate(specific = case_when(expanded_local_min == TRUE ~ "Specific",
                              expanded_local_min == FALSE ~ "Not specific")
         # specific = factor(specific, levels = c("Unspecific", "Specific"))
         ) %>%
  group_by(Type,specific) %>%
  filter(Patient == "P111",
         !is.na(specific)) %>%
  dplyr::count() %>%
  PieDonutSetting(plot_title = "P111")
Warning in `[<-.factor`(`*tmp*`, df3$ratio1 == 0, value = ""): invalid factor
level, NA generated
Warning in `[<-.factor`(`*tmp*`, df3$ratio1 < showRatioThreshold, value = ""):
invalid factor level, NA generated
Warning in ggforce::geom_arc_bar(aes_string(x0 = "x", y0 = "y", r0 =
as.character(r1), : Ignoring unknown aesthetics: explode

6.8 Get session info

sessionInfo()
R version 4.3.2 (2023-10-31)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Rocky Linux 8.10 (Green Obsidian)

Matrix products: default
BLAS/LAPACK: /usr/lib64/libopenblasp-r0.3.15.so;  LAPACK version 3.9.0

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
 [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
 [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
 [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

time zone: America/New_York
tzcode source: system (glibc)

attached base packages:
[1] grid      stats     graphics  grDevices utils     datasets  methods  
[8] base     

other attached packages:
 [1] ggprism_1.0.5   ggforce_0.4.2   moonBook_0.3.1  webr_0.1.5     
 [5] patchwork_1.3.0 reshape2_1.4.4  lubridate_1.9.4 forcats_1.0.0  
 [9] stringr_1.5.1   purrr_1.0.4     readr_2.1.5     tidyr_1.3.1    
[13] tibble_3.2.1    ggplot2_3.5.1   tidyverse_2.0.0 dplyr_1.1.4    

loaded via a namespace (and not attached):
 [1] mnormt_2.1.1            rlang_1.1.5             magrittr_2.0.3         
 [4] rio_1.2.3               compiler_4.3.2          systemfonts_1.2.2      
 [7] vctrs_0.6.5             devEMF_4.5              pkgconfig_2.0.3        
[10] crayon_1.5.3            fastmap_1.2.0           backports_1.5.0        
[13] labeling_0.4.3          promises_1.3.2          rmarkdown_2.29         
[16] tzdb_0.5.0              ragg_1.3.3              xfun_0.50              
[19] cachem_1.1.0            jsonlite_1.8.9          later_1.4.1            
[22] sjmisc_2.8.10           uuid_1.2-1              tweenr_2.0.3           
[25] psych_2.5.3             broom_1.0.8             parallel_4.3.2         
[28] R6_2.6.1                bslib_0.8.0             stringi_1.8.4          
[31] vcd_1.4-13              RColorBrewer_1.1-3      car_3.1-3              
[34] lmtest_0.9-40           jquerylib_0.1.4         Rcpp_1.0.14            
[37] knitr_1.49              zoo_1.8-13              httpuv_1.6.15          
[40] timechange_0.3.0        tidyselect_1.2.1        rstudioapi_0.17.1      
[43] abind_1.4-8             miniUI_0.1.1.1          sjlabelled_1.2.0       
[46] lattice_0.22-7          plyr_1.8.9              shiny_1.9.1            
[49] rrtable_0.3.0           withr_3.0.2             flextable_0.9.7        
[52] askpass_1.2.1           evaluate_1.0.1          polyclip_1.10-7        
[55] zip_2.3.2               xml2_1.3.8              pillar_1.10.1          
[58] ggpubr_0.6.0            carData_3.0-5           DT_0.33                
[61] insight_0.20.3          generics_0.1.3          hms_1.1.3              
[64] munsell_0.5.1           scales_1.3.0            xtable_1.8-4           
[67] glue_1.8.0              gdtools_0.4.2           tools_4.3.2            
[70] data.table_1.15.4       openxlsx_4.2.8          ggsignif_0.6.4         
[73] editData_0.1.8          colorspace_2.1-1        nlme_3.1-168           
[76] Formula_1.2-5           cli_3.6.3               textshaping_1.0.0      
[79] rvg_0.3.3               officer_0.6.8           fontBitstreamVera_0.1.1
[82] ztable_0.2.3            gtable_0.3.6            rstatix_0.7.2          
[85] sass_0.4.9              digest_0.6.37           fontquiver_0.2.1       
[88] htmlwidgets_1.6.4       farver_2.1.2            htmltools_0.5.8.1      
[91] lifecycle_1.0.4         shinyWidgets_0.9.0      mime_0.13              
[94] fontLiberation_0.1.0    openssl_2.3.1           MASS_7.3-60.0.1